{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "predict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "from sklearn.metrics import log_loss  \n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "读取数据&&数据初步探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "file = open('C:/Users/chenxi/Desktop/2ppt/第二周作业/diabetes.csv')\n",
    "train = pd.read_csv(file)\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Outcome分布，看看各类样本分布是否均衡\n",
    "sns.countplot(train.Outcome);\n",
    "pyplot.xlabel('Outcome');\n",
    "pyplot.ylabel('Number of out');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将类别字符串变成数字\n",
    "# drop ids and get labels\n",
    "y_train = train['Outcome']   #形式为Class_x\n",
    "#y_train = y_train.map(lambda s: s[6:])\n",
    "#y_train = y_train.map(lambda s: int(s)-1)\n",
    "\n",
    "train = train.drop([\"Outcome\"], axis=1)\n",
    "X_train = np.array(train)\n",
    "\n",
    "#如果计算资源有限，也可只取少量样本，如取前1000个样本\n",
    "#（分类中其实还需要确保取出来的这部分样本各类样本的比例和总体一致）\n",
    "#n_trains = 1000\n",
    "#y_train = train.label.values[:n_trains]\n",
    "\n",
    "#或者考虑用train_test_split而不是交叉验证来验证模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "#X_test = ss_X.transform(X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [0.49442383 0.50834194 0.4830274  0.43615578 0.48793522]\n",
      "cv logloss is: 0.4819768328671518\n"
     ]
    }
   ],
   "source": [
    "#默认Logistic回归\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "lr= LogisticRegression()\n",
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "#分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "from sklearn.cross_validation import cross_val_score\n",
    "loss = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "print('logloss of each fold is: ',-loss)\n",
    "print('cv logloss is:', -loss.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#正则化的Logistic回归\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#tuned_parameters = {'penalty':['l1','l2'],\n",
    "#                   'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "#                   }\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss')\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.00099697, 0.00119772, 0.00059834, 0.00079994, 0.00099764,\n",
       "        0.00099626, 0.0012116 , 0.00081329, 0.00099168, 0.0009851 ,\n",
       "        0.00097899, 0.00119138, 0.0009902 , 0.00098729]),\n",
       " 'std_fit_time': array([6.50319180e-07, 4.00710258e-04, 4.88538846e-04, 4.00014239e-04,\n",
       "        2.53525846e-05, 6.32595976e-07, 3.91921519e-04, 4.06997160e-04,\n",
       "        1.61158262e-05, 1.71432077e-05, 2.54808678e-05, 4.01741093e-04,\n",
       "        2.74027491e-05, 1.42038256e-05]),\n",
       " 'mean_score_time': array([0.00079861, 0.00059748, 0.00059843, 0.00059686, 0.00059838,\n",
       "        0.00040541, 0.00039916, 0.00039115, 0.00060449, 0.00060587,\n",
       "        0.00060601, 0.00039277, 0.0004056 , 0.00059085]),\n",
       " 'std_score_time': array([0.00074741, 0.00048784, 0.00048862, 0.00048734, 0.00048858,\n",
       "        0.00049661, 0.00048887, 0.00047922, 0.00049371, 0.00049494,\n",
       "        0.00049503, 0.00048118, 0.00049687, 0.00048263]),\n",
       " 'param_C': masked_array(data=[0.001, 0.001, 0.01, 0.01, 0.1, 0.1, 1, 1, 10, 10, 100,\n",
       "                    100, 1000, 1000],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'},\n",
       "  {'C': 1000, 'penalty': 'l1'},\n",
       "  {'C': 1000, 'penalty': 'l2'}],\n",
       " 'split0_test_score': array([-0.69314718, -0.63247716, -0.64643499, -0.51842729, -0.49334652,\n",
       "        -0.4893871 , -0.49423446, -0.49442383, -0.49549853, -0.49553449,\n",
       "        -0.49564785, -0.49565533, -0.49566129, -0.49566752]),\n",
       " 'split1_test_score': array([-0.69314718, -0.64153853, -0.65138433, -0.54263843, -0.51621482,\n",
       "        -0.50836483, -0.50929882, -0.50834194, -0.50875121, -0.50865995,\n",
       "        -0.50870659, -0.5086969 , -0.50870396, -0.50870065]),\n",
       " 'split2_test_score': array([-0.69314718, -0.63662203, -0.64570415, -0.52403018, -0.47822851,\n",
       "        -0.48374951, -0.48179786, -0.4830274 , -0.48313711, -0.48326216,\n",
       "        -0.48327505, -0.48329051, -0.48329215, -0.4832934 ]),\n",
       " 'split3_test_score': array([-0.69314718, -0.63189062, -0.64433664, -0.50307754, -0.45405632,\n",
       "        -0.44275292, -0.43661696, -0.43615578, -0.43569426, -0.43565059,\n",
       "        -0.43560636, -0.43560284, -0.43559987, -0.43559809]),\n",
       " 'split4_test_score': array([-0.69314718, -0.64067605, -0.64757466, -0.53287257, -0.49692605,\n",
       "        -0.48956528, -0.4881039 , -0.48793522, -0.48809057, -0.48807935,\n",
       "        -0.48809864, -0.48809877, -0.4880963 , -0.48810077]),\n",
       " 'mean_test_score': array([-0.69314718, -0.63664181, -0.6470899 , -0.52422544, -0.48778638,\n",
       "        -0.48280717, -0.48206157, -0.48202874, -0.48228731, -0.48229036,\n",
       "        -0.48232006, -0.48232204, -0.4823239 , -0.48232527]),\n",
       " 'std_test_score': array([1.11022302e-16, 4.00318135e-03, 2.39292199e-03, 1.33688676e-02,\n",
       "        2.07332937e-02, 2.16460757e-02, 2.44374567e-02, 2.44134571e-02,\n",
       "        2.47945762e-02, 2.47956827e-02, 2.48353638e-02, 2.48355509e-02,\n",
       "        2.48387062e-02, 2.48395553e-02]),\n",
       " 'rank_test_score': array([14, 12, 13, 11, 10,  9,  2,  1,  3,  4,  5,  6,  7,  8]),\n",
       " 'split0_train_score': array([-0.69314718, -0.63735556, -0.64699594, -0.5192309 , -0.47577822,\n",
       "        -0.46925194, -0.46602423, -0.46594583, -0.46589357, -0.46589258,\n",
       "        -0.46589203, -0.46589201, -0.46589201, -0.46589201]),\n",
       " 'split1_train_score': array([-0.69314718, -0.63310132, -0.63649244, -0.51411049, -0.47224196,\n",
       "        -0.46704903, -0.4642047 , -0.46410775, -0.46406258, -0.4640616 ,\n",
       "        -0.46406112, -0.46406111, -0.4640611 , -0.4640611 ]),\n",
       " 'split2_train_score': array([-0.69314718, -0.6356616 , -0.65056852, -0.51951737, -0.47886859,\n",
       "        -0.47222043, -0.46932988, -0.46925675, -0.46921154, -0.46921058,\n",
       "        -0.4692101 , -0.46921009, -0.46921008, -0.46921008]),\n",
       " 'split3_train_score': array([-0.69314718, -0.63804443, -0.65182756, -0.52743851, -0.48993853,\n",
       "        -0.48357524, -0.48097757, -0.48088442, -0.48084376, -0.48084284,\n",
       "        -0.48084241, -0.4808424 , -0.48084239, -0.48084239]),\n",
       " 'split4_train_score': array([-0.69314718, -0.63358836, -0.646171  , -0.51771935, -0.47759584,\n",
       "        -0.47164861, -0.46882403, -0.46875047, -0.46870587, -0.46870513,\n",
       "        -0.46870465, -0.46870464, -0.46870464, -0.46870464]),\n",
       " 'mean_train_score': array([-0.69314718, -0.63555025, -0.64641109, -0.51960333, -0.47888463,\n",
       "        -0.47274905, -0.46987208, -0.46978904, -0.46974346, -0.46974255,\n",
       "        -0.46974206, -0.46974205, -0.46974205, -0.46974205]),\n",
       " 'std_train_score': array([0.        , 0.00196666, 0.00539262, 0.00436479, 0.00596028,\n",
       "        0.00571694, 0.00585917, 0.0058569 , 0.00585953, 0.00585954,\n",
       "        0.00585957, 0.00585957, 0.00585957, 0.00585957])}"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# view the complete results (list of named tuples)\n",
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.4820287373783356\n",
      "{'C': 1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 拆分训练样本，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.8,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'neg-logloss' )\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "#线性SVM\n",
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.8051948051948052\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.8246753246753247\n",
      "accuracy: 0.7857142857142857\n",
      "accuracy: 0.7337662337662337\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "from sklearn.svm import LinearSVC\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train, y_train, X_val, y_val)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.8181818181818182\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.6948051948051948\n",
      "accuracy: 0.8376623376623377\n",
      "accuracy: 0.8506493506493507\n",
      "accuracy: 0.961038961038961\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8311688311688312\n",
      "accuracy: 0.9025974025974026\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8116883116883117\n",
      "accuracy: 0.9285714285714286\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "#RBF核SVM正则参数调优\n",
    "from sklearn.svm import SVC\n",
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy\n",
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
